\chapter{智能组件}

智能组件是具有独特功能的Manipula组件，可以通过信号控制执行。
智能组件可以控制工作站内其他组件或者机器人的行为，或作为传感器实现机器人对工作站的感知功能，
亦或者作为一个逻辑单元使用。

智能组件由信号和属性构成。

\section{I/O信号}
\label{sec:componentSignal}
I/O信号决定智能组件在什么时间执行什么命令。组件或控制器之间通过信号进行交互，
他们根据输入信息作出反应，并在适当的情况下提供输出。

信号包含以下特性。

\begin{itemize}
    \item \textbf{名称：}必须以英文字母开头，后面可以是英文字母，数字或者下划线。
    \item \textbf{描述：}对于信号的描述。
    \item \textbf{种类：}目前Manipula中智能组件的信号种类仅支持数字信号。
    \item \textbf{值：}数字信号的值应该为0或1。
    \item \textbf{自动复位：}仅适用于数字信号，自动复位的信号会在信号值发生变化时自动恢复默认值(0)。
    \item \textbf{隐藏：}表示信号在编辑智能组件对话框和I/O仿真器中是否可见。但智能
    组件编辑器所显示的信号不受该特性影响。
\end{itemize}

用户可以自由地创建、编辑和删除在自定义组件(UserComponent)中的信号。
对于系统内置的智能组件的信号，用户只能控制信号的值。

\textbf{注：}一个信号的值是其最后一次被指定的值。

\section{信号连接}
\label{sec:signalConnection}
可以使用信号连接来传递信号值。

一般而言，目标信号值会随源信号的值同步变化。但存在一些特殊情况：

\begin{itemize}
    \item 源信号是自动复位信号，目标信号是非自动复位信号。则源信号触发是目标信号随之置1后马上置0。
    \item 源信号是非自动复位信号，目标信号是自动复位信号。则源信号置1时目标信号置1之后迅速置0，源信号置0时目标信号不响应。
\end{itemize}

\textbf{注：}只有信号发生变化的时候才会触发信号连接的传递。

\textbf{注：}信号连接的传递是单向的，即设置目标信号的值不会影响源信号，但可能会造成两者值的不一致。

\subsection{信号连接的规则}
\begin{enumerate}
    \item 子对象的输出信号可以连接到子对象的输入信号。
    \item 父级对象的输入信号可以连接到子对象的输入信号。
    \item 子对象的输出信号可以连接到父对象的输出信号。
    \item 必须是同种类的信号才可以连接。
    \item 禁止创建已经存在的信号连接。
\end{enumerate}

\subsection{信号连接的顺序}
\label{sec:orderOfSignalConnection}
当讨论信号连接的顺序时，隐藏的前提是这些信号连接的起点是相同的。

如果一个信号同时连接到多个信号，在该源信号变化时，位置更靠前的信号连接优先传递信号。

用户可以在\hyperref[sec:signalAndConnections]{信号和连接选项卡}查看和移动信号连接的顺序。

\section{属性}
\label{sec:componentProperty}
属性决定智能组件如何执行动作，其包含了智能组件执行动作所需的必要信息。

属性包含以下特性：

\begin{itemize}
    \item \textbf{名称：}必须以英文字母开头，后面可以是英文字母，数字或者下划线。
    \item \textbf{描述：}对于属性的描述。
    \item \textbf{种类：}属性的种类。
    \item \textbf{值：}属性的值，非法的属性将导致智能组件不会执行。
    \item \textbf{只读：}只读属性不可通过编辑智能组件对话框设置值，不接受同级智能组件的属性连接。
    \item \textbf{隐藏：}表示信号在编辑智能组件对话框是否可见。但智能组件编辑器所显示的信号不受影响。
\end{itemize}

\subsection{属性的种类}

目前，智能组件包含以下种类：

\begin{itemize}
    \item \textbf{ObjectId：}对象的Id。
    \item \textbf{Int32：}32位整型。
    \item \textbf{Double：}浮点型，设置值时可以精确到小数点后两位。
    \item \textbf{String：}字符串。
    \item \textbf{Bool：}布尔类型，值为真或假。
    \item \textbf{Vector3：}三维向量。
    \item \textbf{Orient：}以欧拉角或四元数表示的旋转值。
    \item \textbf{ReferenceFrame：}参考坐标系。
    \item \textbf{Enumeration：}枚举类型。
\end{itemize}

\section{属性连接}
\label{sec:propertyConnection}
可以使用属性连接来传递属性值。

属性连接的目标属性会随源属性值的变化而变化。

\textbf{注：}只有属性发生变化的时候才会触发属性连接的传递。

\textbf{注：}属性连接的传递是单向的，即设置目标属性的值不会影响源属性，但可能会造成两者值的不一致。

\subsection{属性连接的规则}
\begin{enumerate}
    \item 必须是相同种类的属性才可以连接。
    \item 属性不能连接到自己。
    \item 禁止创建已经存在的属性连接。
    \item 一个组件的属性可以连接到其父组件或同级组件或其子组件的属性。
\end{enumerate}

讨论属性连接的顺序是无意义的，因为传递的属性值不会被智能组件处理，因此最终目标接收到的值是一致的。

\section{智能组件编辑器}
智能组件编辑器提供了图形化界面以创建，编辑和组合智能组件。用户可以通过下面的方式打开
智能组件编辑器：

\begin{itemize}
    \item 可以点击顶部建模菜单栏——智能组件创建一个空智能组件并打开其编辑器。
    \item 可以在布局面板右键想要编辑的智能组件，在菜单中选择编辑组件项。
    \item 可以点击智能组件编辑器组成界面的编辑父组件按钮，系统会打开当前智能组件的父组件
          的编辑器。
    \item 可以在智能组件编辑器的组成界面的子组件列表右键想要编辑的智能组件，在菜单中
          选择编辑组件项。
\end{itemize}

\textbf{注：}只有自定义组件可以编辑。

\subsection{布局}
标题栏显示正在编辑的智能组件的图标与名称。

编辑器包含组成、设计、属性和绑定、信号和连接四个选项卡。单击选项卡以切换当前的编辑器页面。

\section{组成选项卡}
组成选项卡用于显示智能组件的构成。其包含添加组件按钮、编辑父组件按钮、子对象和保存的状态四部分内容。

\subsection{添加组件按钮}
点击后系统会弹出可添加类别的菜单，点击具体的菜单选项会创建对应的子对象到正在编辑的组件内。

\subsection{编辑父组件按钮}
点击后系统会打开并切换到正在编辑的组件的父组件的编辑器。

\textbf{注：}工作站逻辑（Station Logic）是最高层级的组件，没有父组件。一个工作站只能有一个
工作站逻辑。工作站逻辑不在布局树中显示，用户只能通过其子组件编辑器的编辑父组件按钮或者仿真工具栏
下的工作站逻辑打开其编辑器。

\subsection{子对象}
子对象列表显示该智能组件所包含的所有对象，显示的顺序为：功能角色，子智能组件，其他。

通过鼠标点击可以选择子对象列表中的项，被选择的项会高亮显示。右侧矩形区域内会同步显示
该对象的相关信息。如果选择的项是智能组件，显示的内容包含该组件的属性和信号的名称、类别和描述。
子对象列表的被选择项和布局树的被选择项同步。

右键点击子对象列表中的项，系统会弹出功能菜单，其包括下面的选项。

\subsubsection{编辑组件}
在中央区域打开该智能组件的编辑器。

\subsubsection{属性}
打开该智能组件的属性查看和编辑对话框，对属性值进行查看和修改。

\subsubsection{删除}
删除对象。参与安装的对象无法直接删除，需要首先执行拆卸操作。

\subsubsection{设定为功能角色}
将一个工具设置为功能角色或却取消设置。

包含功能角色的智能组件在安装到机械臂的tool0时，系统会使用功能角色的工具坐标系相对于智能组件
的位姿创建一个工具数据添加给机械臂。

只有智能组件的子工具可以作为功能角色。一个智能组件最多只能拥有一个功能角色。

参考\hyperref[sec:attachToTool0]{安装}和\hyperref[sec:detachFromTool0]{拆卸}。

\subsection{保存当前状态按钮}
点击后系统在中央区域打开“保存当前状态”面板。通过该面板创建的状态会显示在保存的状态表格中。

\subsection{保存的状态}
保存的状态表格显示该智能组件所包含的用户和系统保存的状态。

\subsubsection{恢复到状态}
将系统恢复到当前状态。

\subsubsection{删除}
删除当前状态。

\section{设计选项卡}
设计选项卡显示智能组件的内部逻辑构成，实现了对智能组件仿真程序的可视化展示与设计。
其包括自定义的信号和属性，子组件，以及信号的连接和属性的绑定。用户可以在该界面对智能组件的
内部逻辑进行组织和编辑。

\subsection{自定义信号}
设计选项卡顶部显示了“输入”和“输出”的标题卡片，点击这些卡片的右侧的“+”号系统会打开
添加I/O信号对话框。

智能组件自定义的信号会显示在标题卡片下方，括号内显示的是信号值。右键点击信号可以打开系统菜单，
点击编辑菜单项会打开编辑I/O信号面板，点击删除菜单项会删除信号。

参考\hyperref[sec:componentSignal]{I/O信号}。

\subsubsection{添加I/O信号对话框}
用户可以创建数字输入或输出信号。打开面板时，焦点为信号名称的输入面板，因为信号的名称是必需的。
其必须以英文字母开头，后面可以是英文字母，数字或者下划线。

信号的描述可以是中文或者英文的。创建多个信号时，他们使用相同的描述。

信号值一栏可以指定信号的默认值。

创建多个信号时，会为信号名称添加由开始索引和间隔指定的数字后缀。

当勾选自动复位复选框时，信号值一栏会被系统设置为0且无法变更。

\subsubsection{编辑I/O信号对话框}
该对话框可以编辑信号的名称、描述、值、自动复位和隐藏的特性。

\subsection{自定义属性}
设计选项卡的顶部中间显示有“属性”标题卡片，点击其右侧“+”号按钮系统会打开添加动态属性对话框。

自定义组件创建的属性会显示在“属性”标题卡片下方，括号内显示的是属性值。

\textbf{注：}工作站逻辑不包含属性。

\textbf{注：}用户不能自定义枚举类型属性。

\subsubsection{添加动态属性对话框}
用户可以为自定义组件添加动态属性。当对话框开启时，焦点将自动定位在属性名称输入框。
属性名称是必填项，需要以英文字母开始，后续可以包含英文字母、数字或下划线。

属性的描述可以是中文或者英文的。

属性值的控件类型会根据当前选择的属性种类而切换。
当属性类型是“ObjectId”时，属性值控件切换为选择对象按钮。
用户点击该按钮后，按钮将进入激活状态（按钮高亮），此时用户可以在布局树中选择对象以设置属性值。
如果选中的对象是合法的，它将被同步到面板上；反之不会被同步。

属性的特性和属性值的合法性参考\hyperref[sec:componentProperty]{属性}。

\subsubsection{编辑动态属性对话框}
该对话框可以编辑动态属性的名称、描述、属性值、只读和隐藏的特性。

\textbf{注：}禁止修改动态属性的类型。

\subsection{子组件}
智能组件的所有子智能组件会以卡片的形式展示在中央面板。子组件卡片会显示子组件的名称，
所有的属性（包括隐藏的）和属性值，和所有的信号（包括隐藏的）和信号值。

在子组件卡片上，信号标题下方显示的是子组件的所有信号。其中位于左半侧的是输入信号，
位于右半侧的是输出信号。

用户可以通过拖动子组件卡片的标题以移动卡片的位置。

右键卡片标题，系统弹出功能菜单。可以打开该子组件的属性编辑对话框或删除该子组件。

\subsection{属性连接}
用户可以点击一个源属性以发起一个属性连接。其可以是子对象卡片上的属性，
也可以是属性标题栏下方的父组件的动态属性。

此时面板区域显示一根终点跟随用户鼠标移动的连接线，面板处于正在连接状态。
在该状态下，点击目标属性即可完成属性连接，并自动结束连接状态。

创建属性连接必须符合\hyperref[sec:propertyConnection]{属性连接的规则}。
点击无效的目标属性不会创建属性连接，并自动结束连接状态。

\subsection{信号连接}
用户可以点击一个源信号以发起信号连接，此时面板显示一根终点跟随用户鼠标
移动的连接线，面板处于正在连接状态。
在该状态下，点击一个目标信号以创建信号连接，并自动结束连接状态。

创建信号连接需要参考\hyperref[sec:signalConnection]{信号连接的规则}。
点击无效的目标信号不会创建信号连接，并自动结束连接状态。

\textbf{注：}在设计选项卡的面板上，不能将父组件的输出信号连接到输入信号。
但可以进一步打开需要连接信号的组件的父组件的智能组件编辑器，将其作为子组件从而实现
输出信号连接到输出信号。

\section{属性和绑定选项卡}
该选项卡显示智能组件的所有自定义属性和属性连接，并可以添加、编辑或删除自定义属性与属性连接。

\textbf{注：}工作站逻辑不包含属性，只显示属性连接。

\section{信号和连接选项卡}
\label{sec:signalAndConnections}
该选项卡显示智能组件所有的自定义信号和信号连接，并可以添加、编辑或删除自定义信号与信号连接。

信号连接表格按顺序显示智能组件的信号连接，该顺序会影响仿真流程，参考\hyperref[sec:orderOfSignalConnection]{信号连接的顺序}。

可以通过“向上移动”按钮调整信号连接的顺序。

\section{LinearMover}

Object属性指定要移动的对象。允许选择的对象为：
\begin{itemize}
    \item 属于Layout的顶层独立的assembly, part和智能组件。
    \item 属于与本LinearMover组件相同的父smart component的assembly, part和智能组件。
\end{itemize}

\section{Attacher}

当parent对象为机器人时，会附着在机器人的法兰上。

当对象A已经附着在对象B上之后，这时编辑对象A的位姿，修改的是附着状态下的A相对于B的位姿。
当解除附着状态时，用户仍然可以选择让A回到附着前的位姿。

\section{Source}
Source组件用于复制一个对象。

源(Source)属性表示要复制的对象。允许选择的对象为：
\begin{itemize}
    \item 属于Layout的顶层独立的assembly和part.
    \item 属于与Source组件相同的父smart component的顶层assembly和part.
\end{itemize}

Parent属性用于指定复制出来的对象所属的父对象。允许选择的对象为：
\begin{itemize}
    \item 属于Layout的顶层独立的assembly和smart component.
    \item 属于与Source组件相同的父smart component的assembly和smart component.
\end{itemize}

Position属性表示的是相对于Parent的位置。

用户通过鼠标在3D区域摄取点时，属性面板的Position会显示当前坐标相对于面板上的Parent对象的坐标向量。如
果通过摄取点设置了Position属性，然后又设置Parent属性，为了保证复制出的物体与摄取点一致需要重新设置
Position属性。
